#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include </usr/include/eigen3/Eigen/Dense>
#include </usr/include/eigen3/Eigen/Sparse>

typedef Eigen::SparseMatrix<double> SpMat; // 声明一个列优先的双精度稀疏矩阵类型
typedef Eigen::Triplet<double> T;

int main(int argc, char* argv[])
{
    int i,j,m,n,l;
    double val;
    int dim = 476417;        // 稀疏矩阵信息，这里偷懒假设事先知道！
    int nnz = 3314441;
    char dummy;  // buffer for reading the data file
    Eigen::SparseMatrix<double> A(dim, dim);  // 打开稀疏矩阵文件
    A.reserve(Eigen::VectorXi::Constant(dim,6));
    FILE* fin = fopen("data476417A.txt", "r");
    if (fin != NULL)
	      printf("稀疏矩阵数据文件打开成功！！\n");
    else{
	      printf("稀疏矩阵数据文件打开失败，请检查！！\n");  
        return 0;
    }
    for (l = 0; l < nnz; l++){      // 开始读取数据
	      fscanf(fin, "%d%c%d%c%lf", &i, &dummy, &j, &dummy, &val);
          A.insert(i - 1, j - 1) = val;
    }
    A.makeCompressed();
    fclose(fin);
    Eigen::VectorXd b(dim); 
    fin = fopen("data476417b.txt", "r");
    if(fin != NULL)
	      printf("右端项数据文件打开成功！！\n");
    else{
	      printf("右端项数据文件打开失败，请检查！！\n");	return 0;
    }
    for(i = 0; i < dim; i++){
	      fscanf(fin, "%le", &val);
          b[i] = val;
    }
    fclose(fin);
    Eigen::SimplicialCholesky<SpMat> chol(A);  // 执行A的 Cholesky分解
	Eigen::VectorXd x = chol.solve(b);         // 使用A的Cholesky分解来求解等号右边的向量b
    //saveAsBitmap(x, dim, argv[1]);
    for(i = 0; i < dim; ++i)
    {
        std::cout << x[i] << std::endl;
    }

    return 0;
}
